home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
data
/
chat
/
chat.plt
< prev
next >
Wrap
Text File
|
1991-10-18
|
12KB
|
399 lines
/* CHAT.PLT: 1991.8.16 By GOOSE(MAF00070)
** 添付のCHAT.DOCをよく読んでから御利用下さい。
** RTCに入る前に起動して下さい。動作中は"/U"を実行しないで下さい。
** "/U"を実行すると表示がおかしくなることがあります。 */
%Y {Yes};%N {No};%DEBUG {No};%R {\n};
%ABORT {dispoff(N);display({\n--応答がありません。STOPします--\n});stop};
%DBG { [com] case(DEBUG,Y,com) };
%PF1 {101};%PF2 {102};%PF3 {103};%PF4 {104};%PF5 {105};%PF6 {106};
%PF7 {107};%PF8 {108};%PF9 {109};%PF10 {110};%PF11 {111};%PF12 {112};
%ULX1 {315};%ULY1 {21};%DRX1 {639};%DRY1 {244};
%ULX2 {0};%ULY2 {21};%DRX2 {306};%DRY2 {244};
%ULX3 {0};%ULY3 {418};%DRX3 {639};%DRY3 {459};
var mno[1];
var data1[1024];var workdata[81920];var data2[1024];
var foottxt[92];var handle[32];var next[1];var xretc[3];
/*getcdirの値の補正(rootなら"\"を取り除く)*/
%getcdir2 {
var temp[48];temp:=@getcdir;
case(@getchar(temp,@nochar(temp))={\},Y,{temp:=@body(temp,,{\})},N,);
im(temp)
};
/* 押/クリックされたiを正しい要素番号に変換する。参照する情報は
** 以下のとおり。next */
%chgpfno { [i]
var retc[2];case(next!=0,Y,{retc:=next*(max-1)+i},N,{retc:=i});im(retc)
};
/* strの中からdlmtで区切られたi番目以降の文字列を返す */
%skipn { [str,i,dlmt]
var work[1024];var j[2];
work:=str;j:=i;
loop({case(j<=1,Y,{im(N)},N,{j:=j-1;work:=@body(work,dlmt);im(Y)})});
im(work)
};
/* "ボタン//IDハンドル\n・・・"からPFiのハンドルを返す。 */
%gethandle { [str,i]
%temp @tail(@head(@skipn(str,@chgpfno(i),R),R),{//});
im( @getchar(temp,9) )
};
/* 以下の情報からfootnoteのボタンを作る。
** data2,next,recv */
%makebtn {
var j[2];
var work[1024];j:=0;foottxt:={};
work:=@skipn(data2,@chgpfno(1),R);
loop({
%temp @head(work,R);work:=@body(work,R);j:=j+1;
case(temp<>{} && j<max,
Y,{foottxt:=foottxt|@head(temp,{//});im(Y) },
N,{im(N)}
)});
foottxt:=foottxt|{--------------------------------------------};
j:=(max-1)*4;
%temp @case(recv,Y,{im({受終})},N,{im({受始})});
foottxt:=@getchar(foottxt,1,j)|{次頁};
foottxt:=foottxt|@case(recv,Y,{im({受終})},N,{im({受始})});
foottxt:=foottxt|{終了送信};
};
/* "/U"の出力(の連続体)を受け取って"ボタン//IDハンドル\n"を変数data2に作る。 */
%makebhi { [data]
var work1[1024];var work2[1024];var i[2];
work1:=data;work2:=data2;data2:={};
loop({
%temp1 @head(work2,R);work2:=@body(work2,R);
%temp2 @getchar(@tail(temp1,{//}),1,8)|{ }|@getchar(@tail(temp1,{//}),9);
case(temp1={},
Y,{im(N)},
N,{case(@body(data,temp2)<>{},Y,{data2:=data2|temp1|R});im(Y) }
)
});
loop({
%temp1 @head(work1,R);work1:=@body(work1,R);
case(temp1={},
Y,{im(N)},
N,{
%temp2 @getchar(temp1,12,8)|@getchar(temp1,21);
case(@body(data2,temp2)<>{},N,{
%button @getchar(@getchar(temp1,21)|{ },1,4);
data2:=data2|button|{//}|temp2|R});
im(Y)
}
)
});
};
/* コマンドラインの状態からPF12(送信)が押された */
%cl2m2p12 {
type(@memo(mno+2,@xlinenum,1)|R);
case(@mcheck<>0,Y,{mclose(1)});mclear(mno+2);mopen(mno+2)
};
/* メモ2(テキスト)の状態からPF12(確定)が押された */
%m22m1p12 {
%temp @head(@memo(mno+1,@xlinenum,1),R);
mclose(1);madd(mno+2,temp);mopen(mno+2)
};
/* メモ1(一覧)の状態からPF12(確定)が押された */
%m12clp12 {
%temp1 @memo(mno,@xlinenum,1);
handle:=@head(@getchar(temp1,21),R);
case(handle={ },
Y,{type(@memo(mno+2)|R)},
N,{type(@memo(mno+2)|to|handle|R)});
%temp2 {//}|@getchar(temp1,12,8)|@getchar(temp1,21);
%temp3 @tail(@head(data2,temp2),R)|temp2;
data2:=temp3|@head(data2,temp3)|@tail(data2,temp3);next:=0;
case(@mcheck<>0,Y,{mclose(1)});mclear(mno+2);mopen(mno+2)
};
/* メモ2(テキスト)の状態からPF11(取消)が押された */
%m22clp11 {
case(@mcheck<>0,Y,{mclose(1)});mopen(mno+2)
};
/* メモ1(一覧)の状態からPF11(取消)が押された */
%m12m2p11 {
mclose(1);mopen(mno+2)
};
/* メモ2(テキスト)の状態からPF1~PF9(ハンドル)が押/クリックされた */
%m22p {
%temp1 @case(xretc>200,Y,{im(xretc-200)},N,{im(xretc)});
%temp2 @case(temp1>100,Y,{im(temp1-100)},N,{im(temp1)});
case(@chgpfno(temp2)<@noline(@memo(mno)),Y,{
handle:=@gethandle(data2,temp2);
case(handle={ },
Y,{type(@memo(mno+2,@xlinenum,1)|R)},
N,{type(@memo(mno+2,@xlinenum,1)|to|handle|R)});
%temp3 @head(@skipn(data2,@chgpfno(temp2),R),R)|R;
data2:=temp3|@head(data2,temp3)|@tail(data2,temp3);next:=0;
DBG({display(@head(@memo(mno+2,@xlinenum,1),R)|handle|R)});
mclose(1);mclear(mno+2);mopen(mno+2)
})
};
/* メモ1(一覧)の状態からPF1~PF9(ハンドル)が押/クリックされた */
%m12p {
%temp1 @case(xretc>200,Y,{im(xretc-200)},N,{im(xretc)});
%temp2 @case(temp1>100,Y,{im(temp1-100)},N,{im(temp1)});
case(@chgpfno(temp2)<@noline(@memo(mno)),Y,{
handle:=@gethandle(data2,temp2);
case(handle={ },
Y,{type(@memo(mno+2,@xlinenum,1)|R)},
N,{type(@memo(mno+2,@xlinenum,1)|to|handle|R)});
%temp3 @head(@skipn(data2,@chgpfno(temp2),R),R)|R;
data2:=temp3|@head(data2,temp3)|@tail(data2,temp3);next:=0;
mclose(1);mclear(mno+2);mopen(mno+2)
})
};
/* メモ1(一覧)がクリックされた */
%uidproc {
%temp @getchar(@head(@memo(mno,@xlinenum,1),R),12);
select({"}|temp|{"},3600,{im({})},
{ にPAGEを送る },{
type({/PA }|@getchar(@head(@memo(mno,@xlinenum,1),R),1,4)|R|
myhandle|{>}|@memo(mno+2)|R);
mclose(1);mclear(mno+2);mopen(mno+2)
},
{ のプロフィール拝見 },{
type({/PR }|@getchar(@head(@memo(mno,@xlinenum,1),R),12,8)|R);
mclose(1);mclear(mno+2);mopen(mno+2)
}
);
};
/* メモの状態からPF10(ログ開始/ログ停止),または,コマンドラインからPF11が押/クリックされた*/
%logrecv {
case(recv=N,
Y,{
case(recvfile={},Y,{
%temp @select({ログ格納ファイルが指定されていません。指定して下さい。},
3600,{im({})},{ 確認 },{im(Y)});
case(temp=Y,Y,{recvfile:=@filesel});
});
case(recvfile<>{},Y,{receive(recvfile);recv:=Y});
},
N,{stoprec;recv:=N}
)
};
%sortid { [iddata,idfile]
case(@filechk(idfile)=Y,Y,{workdata:=@read(idfile)});
%temp1 @getchar(idfile,1,2);%temp2 @body(@getchar(idfile,3),,{\});
dispoff(Y);command(temp1);command({CD }|temp2);dispoff(N);
dispoff(Y);command({DEL }|idfile);dispoff(N);
case(@diskrem<81920,Y,{
display({"}|idfile|{"のドライブの空きが80KB以下です。処理を中断します。});
write(idfile,workdata);
stop
});
write(idfile,iddata);
loop({
%temp @head(workdata,R);
workdata:=@body(workdata,R);
case(temp={},
Y,{im(N)},
N,{
case(@body(iddata,@getchar(temp,1,8))={},Y,{write(idfile,temp|R)});
im(Y)
})
})
};
%end {
type({/E}|R);
wait(20,{ABORT},{\n>},,{\nFORUM>},);
case(recv=Y,Y,{stoprec});
case(@mcheck<>0,Y,{mclose(1)});
mopen(mno);mclose(3);mclose(3);
case(idfile<>{},Y,{sortid(@memo(mno+1),idfile)});
case(textfile<>{},Y,{mclose(1)});
case(idfile<>{},Y,{mopen(mno+1);mclose(3)});
case(textfile={},Y,{mopen(mno);mclose(3)});
stop
};
/* 初回分のdata1を作る */
%getu1 {
dispoff(Y);type({/U }|channel|R|{/DAMMY}|R);
wait(10,{ABORT},{\n JOB CH ID HANDLE },);
wait(5,{ABORT},R,);
loop({
wait(20,{ABORT},
{コマンドはありません◆\n},{dispoff(N);im(N)},
R,{
%temp @tail(@body(@laststr(128),,R),R);
case(@getchar(temp,1,1)={ },
Y,{data1:=data1|temp|R;
case(idfile<>{},
Y,{case(@mcheck<>0,Y,{mclose(1)});
madd(mno+3,@getchar(temp,12)|{//}|day|{//}|forum|R)});
},
N,{dispoff(N);display(temp|R);dispoff(Y)}
);
im(Y)
})
});
data1:=data1|{ ** ** ******** \n ** ** ******** ALL\n};
};
/* data1を作る(2回目以降) */
%getu2 {
var workdata[1024];var waitok[3];var recon[3];
recon:=N;workdata:={};waitok:=N;
dispoff(Y);
case(recv=Y,Y,{stoprec;recon:=N});
type({/U }|channel|R|{/DAMMY}|R);
wait(10,{ABORT},{\n JOB CH ID HANDLE },);
wait(5,{ABORT},R,);
loop({
waitx(20,{case(recv=Y,Y,{receive(recvfile);recon:=Y});dispoff(N);im(N)},
{コマンドはありません◆\n},
{case(recv=Y,Y,{receive(recvfile);recon:=Y});dispoff(N);waitok:=Y;im(N)},
R,{
%temp @tail(@body(@laststr(128),,R),R);
case(@getchar(temp,1,1)={ },
Y,{
workdata:=workdata|temp|R;
case(@body(data1,,@getchar(temp,12,8))={},
Y,{
dispoff(N);
display({--"}|@getchar(temp,21)|{"が来たよ!!--}|R);
dispoff(Y);
case(idfile<>{},
Y,{case(@mcheck<>0,Y,{mclose(1)});
madd(mno+3,@getchar(temp,12)|{//}|day|{//}|forum|R)});
})
},
N,{dispoff(N);display(temp|R);dispoff(Y) }
);
im(Y)
})
});
case(recv=Y && recon=N,Y,{receive(recvfile)});
case(waitok=Y,Y,{
data1:=workdata|{ ** ** ******** \n ** ** ******** ALL\n};
case(@mcheck<>0,Y,{mclose(1)});
mclear(mno);madd(mno,data1);mopen(mno);mclose(1);mopen(mno+2);
});
};
/***************************************************************************/
%nemchat { [ch,myhandle,int,nowrecv,recvf,text,idfile]
var channel[2];var inttime[3];var recv[3];var recvfile[64];var textfile[64];
channel:=ch;inttime:=int;recv:=nowrecv;recvfile:=recvf;textfile:=text;
data1:={};workdata:={};%to { > };
case(myhandle<>{},Y,{type({/HA }|myhandle|R)});
case(textfile<>{},Y,{
madd(mno+1,@read(textfile));madd(mno+2,{});
mopen(mno+1,ULX2,ULY2,DRX2,DRY2,{w});mclose(1);
});
case(idfile<>{},Y,{
madd(mno+3,{});mopen(mno+3,ULX1,ULY1,DRX1,DRY1,{r});mclose(2);
case(textfile<>{},Y,{mclose(1)});
});
getu1;
makebhi(data1);
DBG({display({data2="}|data2|{"}|R)});
case(@mcheck<>0,Y,{mclose(1)});madd(mno,data1);
mopen(mno,ULX1,ULY1,DRX1,DRY1,{r});mclose(1);
mopen(mno+2,ULX3,ULY3,DRX3,DRY3,{w});
next:=0;
chat(Y);
loop({
%max {9};
makebtn;
footnote(foottxt,{b});
waitx(inttime);
xretc:=@xtype;
case(xretc,
mno,{uidproc},
mno+1,{case(textfile<>{},Y,{m22m1p12})},
212,{cl2m2p12},PF12,{cl2m2p12},
211,{end},PF11,{end},
210,{logrecv},PF10,{logrecv},
209,{
case(@getchar(foottxt,33,4)={次頁},Y,{next:=next+1});
case(next*(max-1)+max-@noline(@memo(mno))>max,Y,{next:=0});
},
PF9,{
case(@getchar(foottxt,33,4)={次頁},Y,{next:=next+1});
case(next*(max-1)+max-@noline(@memo(mno))>max,Y,{next:=0});
},
-2,{getu2;makebhi(data1);
DBG({display({["/U"入力&data1作成] ルーチンCALL\n})})},
,{m22p}
);
im(Y)
});
};
/***************************************************************************/
%rtcb @select({ どちらですか?},3600,{im({})},
{ RTC },{im({RT})},
{ CB },{im({CB})} );
%forum @case(rtcb={RT},
Y,{im(@input({ フォーラム名を入力して下さい。 例) FTOWNS1}))},
N,{im({})});
%band @case(rtcb={CB},
Y,{im(@select({ Bandを選択して下さい。},3600,{im({})},{ A },{im({1})},{ B },{im({2})}))},
N,{im({})});
%name @input({ ハンドルネームを入力して下さい。});
%txtfile @select({ あらかじめ作成したテキストを利用しますか?},3600,{im({})},
{ 利用する },{%temp @filesel;im(@getcdir2|{\}|temp)},
{ 利用しない },{im({})} );
%idhfile @select({ RTC/CBで出会った人のID,ハンドルを記録しますか?},3600,{im({})},
{ 記録する },{%temp @filesel;im(@getcdir2|{\}|temp)},
{ 記録しない },{im({})} );
%recvon {No};
%recvfile {};
case(@mcheck<>0,Y,{mclose(1)});
mno:=@mlast+1;%temp @case(idhfile<>{},Y,{im({4})},N,{im({3})});
case(mno+temp>=10,
Y,{display({空きのメモが足りません。不要なメモを削除して下さい。\n});stop});
mclear(mno);mclear(mno+1);mclear(mno+2);
madd(mno,{});madd(mno+1,{});madd(mno+2,{});
case(idhfile<>{},Y,{mclear(mno+3);madd(mno+3,{})});
%inttime @input({"/U" を発行する間隔(秒)を入力して下さい。},,30);
case(rtcb={RT},Y,{type({GO }|forum|R)},N,{type({GO CB}|R)});
loop({
wait(20,{ABORT},
{\n>},{im({No})},
{\nFORUM>},{im({No})},
{\n続き (改行で表示},{type({\n});im({Yes})},
{\nmore>},{type({\n});im({Yes})})
});
type({TIME\n});
wait(20,{ABORT},{\n ご利用時間 },);
%day @tail(@body(@laststr(128),,{\n ご利用時間 }),{\n });
wait(20,{ABORT},{\n>},,{\nFORUM>},);
case(rtcb={CB},
Y,{type(band|R);wait(20,{ABORT},{\nハンドルネーム\n:},);type(name|R)},
N,{type({RTC}|R)}
);
wait(20,{ABORT},{まで)\n:},);
%channel @input({ チャンネルを入力して下さい。},,{1});
type(channel|R);
case(rtcb={CB},
Y,{wait(20,{ABORT},{終了:/E)*\n})},
N,{wait(20,{ABORT},{終了:/E)-\n})}
);
nemchat(channel,name,inttime,{No},{},txtfile,idhfile);